library(tidyverse)
library(ggtext)
cols <- c("region", "chr", "midPos", "Nsites", "Fst")
matxgrt_data <- read_delim("data/pw_fst/sliding_window_fst-4ind-pop-size/MAT--x--GRT--size-50000--step-10000.tsv",
skip = 2,
delim = "\t",
col_names = cols,
show_col_types = FALSE)
matxgrt_data_cum <- matxgrt_data %>%
group_by(chr) %>%
summarise(max_pos = max(midPos)) %>%
mutate(pos_add = lag(cumsum(max_pos), default = 0)) %>%
select(chr, pos_add)
matxgrt_data <- matxgrt_data %>%
inner_join(matxgrt_data_cum, by = "chr") %>%
mutate(pos_cum = midPos + pos_add)
matxgrt_axis_set <- matxgrt_data %>%
group_by(chr) %>%
summarise(center = mean(pos_cum))
matxgrt_plot <- ggplot(data = matxgrt_data,
mapping = aes(x = pos_cum,
y = Fst,
color = as_factor(chr))) +
geom_point(alpha = 0.75, size = 0.5) +
geom_hline(yintercept = mean(matxgrt_data$Fst)) +
geom_hline(yintercept = quantile(matxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_x_continuous(label = matxgrt_axis_set$chr,
breaks = matxgrt_axis_set$center) +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
scale_color_manual(values = rep(c("darkslateblue", "thistle"),
unique(length(matxgrt_axis_set$chr)))) +
labs(x = NULL,
y = "Fst",
title = "MAT--x--GRT--size-50000--step-10000") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
matxgrt_plot

matxgrt_chr2_plot <- ggplot(data = filter(matxgrt_data, chr == "JBGGWU010000002.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(matxgrt_data$Fst)) +
geom_hline(yintercept = quantile(matxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "MAT--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 2 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
matxgrt_chr2_plot

matxgrt_chr2_elev_plot <- ggplot(data = filter(matxgrt_data, chr == "JBGGWU010000002.1" & midPos >= 50000000 & midPos <= 53000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(matxgrt_data$Fst)) +
geom_hline(yintercept = quantile(matxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "MAT--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 2 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
matxgrt_chr2_elev_plot

matxgrt_chr3_plot <- ggplot(data = filter(matxgrt_data, chr == "JBGGWU010000003.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(matxgrt_data$Fst)) +
geom_hline(yintercept = quantile(matxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "MAT--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 3 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
matxgrt_chr3_plot

matxgrt_chr3_elev_plot <- ggplot(data = filter(matxgrt_data, chr == "JBGGWU010000003.1" & midPos >= 29000000 & midPos <= 32000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(matxgrt_data$Fst)) +
geom_hline(yintercept = quantile(matxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "MAT--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 3 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
matxgrt_chr3_elev_plot

canxgrt_data <- read_delim("data/pw_fst/sliding_window_fst-4ind-pop-size/CAN--x--GRT--size-50000--step-10000.tsv",
skip = 2,
delim = "\t",
col_names = cols,
show_col_types = FALSE)
canxgrt_data_cum <- canxgrt_data %>%
group_by(chr) %>%
summarise(max_pos = max(midPos)) %>%
mutate(pos_add = lag(cumsum(max_pos), default = 0)) %>%
select(chr, pos_add)
canxgrt_data <- canxgrt_data %>%
inner_join(canxgrt_data_cum, by = "chr") %>%
mutate(pos_cum = midPos + pos_add)
canxgrt_axis_set <- canxgrt_data %>%
group_by(chr) %>%
summarise(center = mean(pos_cum))
canxgrt_plot <- ggplot(data = canxgrt_data,
mapping = aes(x = pos_cum,
y = Fst,
color = as_factor(chr))) +
geom_point(alpha = 0.75, size = 0.5) +
geom_hline(yintercept = mean(canxgrt_data$Fst)) +
geom_hline(yintercept = quantile(canxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_x_continuous(label = canxgrt_axis_set$chr,
breaks = canxgrt_axis_set$center) +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
scale_color_manual(values = rep(c("darkslateblue", "thistle"),
unique(length(canxgrt_axis_set$chr)))) +
labs(x = NULL,
y = "Fst",
title = "CAN--x--GRT--size-50000--step-10000") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxgrt_plot

canxgrt_chr2_plot <- ggplot(data = filter(canxgrt_data, chr == "JBGGWU010000002.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxgrt_data$Fst)) +
geom_hline(yintercept = quantile(canxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 2 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxgrt_chr2_plot

canxgrt_chr2_elev_plot <- ggplot(data = filter(canxgrt_data, chr == "JBGGWU010000002.1" & midPos >= 50000000 & midPos <= 53000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxgrt_data$Fst)) +
geom_hline(yintercept = quantile(canxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 2 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxgrt_chr2_elev_plot

canxgrt_chr3_plot <- ggplot(data = filter(canxgrt_data, chr == "JBGGWU010000003.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxgrt_data$Fst)) +
geom_hline(yintercept = quantile(canxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 3 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxgrt_chr3_plot

canxgrt_chr3_elev_plot <- ggplot(data = filter(canxgrt_data, chr == "JBGGWU010000003.1" & midPos >= 29000000 & midPos <= 32000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxgrt_data$Fst)) +
geom_hline(yintercept = quantile(canxgrt_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--GRT--size-50000--step-1000",
subtitle = "Chromosome 3 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxgrt_chr3_elev_plot

canxmat_data <- read_delim("data/pw_fst/sliding_window_fst-4ind-pop-size/CAN--x--MAT--size-50000--step-10000.tsv",
skip = 2,
delim = "\t",
col_names = cols,
show_col_types = FALSE)
canxmat_data_cum <- canxmat_data %>%
group_by(chr) %>%
summarise(max_pos = max(midPos)) %>%
mutate(pos_add = lag(cumsum(max_pos), default = 0)) %>%
select(chr, pos_add)
canxmat_data <- canxmat_data %>%
inner_join(canxmat_data_cum, by = "chr") %>%
mutate(pos_cum = midPos + pos_add)
canxmat_axis_set <- canxmat_data %>%
group_by(chr) %>%
summarise(center = mean(pos_cum))
canxmat_plot <- ggplot(data = canxmat_data,
mapping = aes(x = pos_cum,
y = Fst,
color = as_factor(chr))) +
geom_point(alpha = 0.75, size = 0.5) +
geom_hline(yintercept = mean(canxmat_data$Fst)) +
geom_hline(yintercept = quantile(canxmat_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_x_continuous(label = canxmat_axis_set$chr,
breaks = canxmat_axis_set$center) +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
scale_color_manual(values = rep(c("darkslateblue", "thistle"),
unique(length(canxmat_axis_set$chr)))) +
labs(x = NULL,
y = "Fst",
title = "CAN--x--MAT--size-50000--step-10000") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxmat_plot

canxmat_chr2_plot <- ggplot(data = filter(canxmat_data, chr == "JBGGWU010000002.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxmat_data$Fst)) +
geom_hline(yintercept = quantile(canxmat_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--MAT--size-50000--step-1000",
subtitle = "Chromosome 2 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxmat_chr2_plot

canxmat_chr2_elev_plot <- ggplot(data = filter(canxmat_data, chr == "JBGGWU010000002.1" & midPos >= 50000000 & midPos <= 53000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxmat_data$Fst)) +
geom_hline(yintercept = quantile(canxmat_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--MAT--size-50000--step-1000",
subtitle = "Chromosome 2 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxmat_chr2_elev_plot

canxmat_chr3_plot <- ggplot(data = filter(canxmat_data, chr == "JBGGWU010000003.1"),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxmat_data$Fst)) +
geom_hline(yintercept = quantile(canxmat_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--MAT--size-50000--step-1000",
subtitle = "Chromosome 3 YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxmat_chr3_plot

canxmat_chr3_elev_plot <- ggplot(data = filter(canxmat_data, chr == "JBGGWU010000003.1" & midPos >= 29000000 & midPos <= 32000000),
mapping = aes(x = midPos,
y = Fst)) +
geom_point(alpha = 0.75, size = 0.5, color = "darkslateblue") +
geom_hline(yintercept = mean(canxmat_data$Fst)) +
geom_hline(yintercept = quantile(canxmat_data$Fst, probs = c(0.99)),
linetype = "dashed",
colour = "red") +
scale_y_continuous(expand = c(0,0),
limits = c(-0.05, 1)) +
labs(x = "Mid-Window Position",
y = "Fst",
title = "CAN--x--MAT--size-50000--step-1000",
subtitle = "Chromosome 3 elevated YU_APseudo genome") +
theme_bw() +
theme(legend.position = "none",
panel.grid.major.x = element_blank(),
panel.grid.minor.x = element_blank(),
axis.title.y = element_markdown(),
axis.text.x = element_text(angle = 90,
size = 8,
vjust = 0.5))
canxmat_chr3_elev_plot

LS0tCnRpdGxlOiAiU2xpZGluZyBXaW5kb3dzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3IgcGFja2FnZXN9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KGdndGV4dCkKYGBgCgoKYGBge3IgbWF0eGdydH0KY29scyA8LSBjKCJyZWdpb24iLCAiY2hyIiwgIm1pZFBvcyIsICJOc2l0ZXMiLCAiRnN0IikKCm1hdHhncnRfZGF0YSA8LSByZWFkX2RlbGltKCJkYXRhL3B3X2ZzdC9zbGlkaW5nX3dpbmRvd19mc3QtNGluZC1wb3Atc2l6ZS9NQVQtLXgtLUdSVC0tc2l6ZS01MDAwMC0tc3RlcC0xMDAwMC50c3YiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjb2xzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKCm1hdHhncnRfZGF0YV9jdW0gPC0gbWF0eGdydF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgobWlkUG9zKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHIsIHBvc19hZGQpCgptYXR4Z3J0X2RhdGEgPC0gbWF0eGdydF9kYXRhICU+JSAKICBpbm5lcl9qb2luKG1hdHhncnRfZGF0YV9jdW0sIGJ5ID0gImNociIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gbWlkUG9zICsgcG9zX2FkZCkKCm1hdHhncnRfYXhpc19zZXQgPC0gbWF0eGdydF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgptYXR4Z3J0X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBtYXR4Z3J0X2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocikpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKG1hdHhncnRfZGF0YSRGc3QpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhbnRpbGUobWF0eGdydF9kYXRhJEZzdCwgcHJvYnMgPSBjKDAuOTkpKSwgCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAKICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gbWF0eGdydF9heGlzX3NldCRjaHIsIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBtYXR4Z3J0X2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiZGFya3NsYXRlYmx1ZSIsICJ0aGlzdGxlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChtYXR4Z3J0X2F4aXNfc2V0JGNocikpKSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIk1BVC0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbWF0eGdydF9wbG90CgptYXR4Z3J0X2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihtYXR4Z3J0X2RhdGEsIGNociA9PSAiSkJHR1dVMDEwMDAwMDAyLjEiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4obWF0eGdydF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShtYXR4Z3J0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIk1BVC0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm1hdHhncnRfY2hyMl9wbG90CgptYXR4Z3J0X2NocjJfZWxldl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1hdHhncnRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDIuMSIgJiBtaWRQb3MgPj0gNTAwMDAwMDAgJiBtaWRQb3MgPD0gNTMwMDAwMDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbWlkUG9zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4obWF0eGdydF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShtYXR4Z3J0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIk1BVC0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBlbGV2YXRlZCBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCm1hdHhncnRfY2hyMl9lbGV2X3Bsb3QKCm1hdHhncnRfY2hyM19wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKG1hdHhncnRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDMuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1pZFBvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihtYXR4Z3J0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKG1hdHhncnRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiTUFULS14LS1HUlQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbWF0eGdydF9jaHIzX3Bsb3QKCm1hdHhncnRfY2hyM19lbGV2X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIobWF0eGdydF9kYXRhLCBjaHIgPT0gIkpCR0dXVTAxMDAwMDAwMy4xIiAmIG1pZFBvcyA+PSAyOTAwMDAwMCAmIG1pZFBvcyA8PSAzMjAwMDAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihtYXR4Z3J0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKG1hdHhncnRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiTUFULS14LS1HUlQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIGVsZXZhdGVkIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKbWF0eGdydF9jaHIzX2VsZXZfcGxvdApgYGAKCmBgYHtyIGNhbnhncnR9CmNhbnhncnRfZGF0YSA8LSByZWFkX2RlbGltKCJkYXRhL3B3X2ZzdC9zbGlkaW5nX3dpbmRvd19mc3QtNGluZC1wb3Atc2l6ZS9DQU4tLXgtLUdSVC0tc2l6ZS01MDAwMC0tc3RlcC0xMDAwMC50c3YiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjb2xzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKCmNhbnhncnRfZGF0YV9jdW0gPC0gY2FueGdydF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgobWlkUG9zKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHIsIHBvc19hZGQpCgpjYW54Z3J0X2RhdGEgPC0gY2FueGdydF9kYXRhICU+JSAKICBpbm5lcl9qb2luKGNhbnhncnRfZGF0YV9jdW0sIGJ5ID0gImNociIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gbWlkUG9zICsgcG9zX2FkZCkKCmNhbnhncnRfYXhpc19zZXQgPC0gY2FueGdydF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpjYW54Z3J0X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBjYW54Z3J0X2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocikpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKGNhbnhncnRfZGF0YSRGc3QpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhbnRpbGUoY2FueGdydF9kYXRhJEZzdCwgcHJvYnMgPSBjKDAuOTkpKSwgCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAKICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gY2FueGdydF9heGlzX3NldCRjaHIsIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjYW54Z3J0X2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiZGFya3NsYXRlYmx1ZSIsICJ0aGlzdGxlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChjYW54Z3J0X2F4aXNfc2V0JGNocikpKSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueGdydF9wbG90CgpjYW54Z3J0X2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihjYW54Z3J0X2RhdGEsIGNociA9PSAiSkJHR1dVMDEwMDAwMDAyLjEiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oY2FueGdydF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShjYW54Z3J0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmNhbnhncnRfY2hyMl9wbG90CgpjYW54Z3J0X2NocjJfZWxldl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKGNhbnhncnRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDIuMSIgJiBtaWRQb3MgPj0gNTAwMDAwMDAgJiBtaWRQb3MgPD0gNTMwMDAwMDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbWlkUG9zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oY2FueGdydF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShjYW54Z3J0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tR1JULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBlbGV2YXRlZCBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmNhbnhncnRfY2hyMl9lbGV2X3Bsb3QKCmNhbnhncnRfY2hyM19wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKGNhbnhncnRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDMuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1pZFBvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihjYW54Z3J0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKGNhbnhncnRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiQ0FOLS14LS1HUlQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueGdydF9jaHIzX3Bsb3QKCmNhbnhncnRfY2hyM19lbGV2X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIoY2FueGdydF9kYXRhLCBjaHIgPT0gIkpCR0dXVTAxMDAwMDAwMy4xIiAmIG1pZFBvcyA+PSAyOTAwMDAwMCAmIG1pZFBvcyA8PSAzMjAwMDAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihjYW54Z3J0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKGNhbnhncnRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiQ0FOLS14LS1HUlQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIGVsZXZhdGVkIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueGdydF9jaHIzX2VsZXZfcGxvdApgYGAKCmBgYHtyIGNhbnhtYXR9CmNhbnhtYXRfZGF0YSA8LSByZWFkX2RlbGltKCJkYXRhL3B3X2ZzdC9zbGlkaW5nX3dpbmRvd19mc3QtNGluZC1wb3Atc2l6ZS9DQU4tLXgtLU1BVC0tc2l6ZS01MDAwMC0tc3RlcC0xMDAwMC50c3YiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCA9IDIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbSA9ICJcdCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xfbmFtZXMgPSBjb2xzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jb2xfdHlwZXMgPSBGQUxTRSkKCmNhbnhtYXRfZGF0YV9jdW0gPC0gY2FueG1hdF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKG1heF9wb3MgPSBtYXgobWlkUG9zKSkgJT4lCiAgbXV0YXRlKHBvc19hZGQgPSBsYWcoY3Vtc3VtKG1heF9wb3MpLCBkZWZhdWx0ID0gMCkpICU+JQogIHNlbGVjdChjaHIsIHBvc19hZGQpCgpjYW54bWF0X2RhdGEgPC0gY2FueG1hdF9kYXRhICU+JSAKICBpbm5lcl9qb2luKGNhbnhtYXRfZGF0YV9jdW0sIGJ5ID0gImNociIpICU+JQogIG11dGF0ZShwb3NfY3VtID0gbWlkUG9zICsgcG9zX2FkZCkKCmNhbnhtYXRfYXhpc19zZXQgPC0gY2FueG1hdF9kYXRhICU+JQogIGdyb3VwX2J5KGNocikgJT4lCiAgc3VtbWFyaXNlKGNlbnRlciA9IG1lYW4ocG9zX2N1bSkpCgpjYW54bWF0X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBjYW54bWF0X2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IHBvc19jdW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gYXNfZmFjdG9yKGNocikpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBtZWFuKGNhbnhtYXRfZGF0YSRGc3QpKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gcXVhbnRpbGUoY2FueG1hdF9kYXRhJEZzdCwgcHJvYnMgPSBjKDAuOTkpKSwgCiAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiLCAKICAgICAgICAgICAgIGNvbG91ciA9ICJyZWQiKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVsID0gY2FueG1hdF9heGlzX3NldCRjaHIsIAogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjYW54bWF0X2F4aXNfc2V0JGNlbnRlcikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSByZXAoYygiZGFya3NsYXRlYmx1ZSIsICJ0aGlzdGxlIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pcXVlKGxlbmd0aChjYW54bWF0X2F4aXNfc2V0JGNocikpKSkgKwogIGxhYnMoeCA9IE5VTEwsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tTUFULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAwIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueG1hdF9wbG90CgpjYW54bWF0X2NocjJfcGxvdCA8LSBnZ3Bsb3QoZGF0YSA9IGZpbHRlcihjYW54bWF0X2RhdGEsIGNociA9PSAiSkJHR1dVMDEwMDAwMDAyLjEiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oY2FueG1hdF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShjYW54bWF0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tTUFULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmNhbnhtYXRfY2hyMl9wbG90CgpjYW54bWF0X2NocjJfZWxldl9wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKGNhbnhtYXRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDIuMSIgJiBtaWRQb3MgPj0gNTAwMDAwMDAgJiBtaWRQb3MgPD0gNTMwMDAwMDApLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZyA9IGFlcyh4ID0gbWlkUG9zLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ID0gRnN0KSkgKwogIGdlb21fcG9pbnQoYWxwaGEgPSAwLjc1LCBzaXplID0gMC41LCBjb2xvciA9ICJkYXJrc2xhdGVibHVlIikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IG1lYW4oY2FueG1hdF9kYXRhJEZzdCkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBxdWFudGlsZShjYW54bWF0X2RhdGEkRnN0LCBwcm9icyA9IGMoMC45OSkpLCAKICAgICAgICAgICAgIGxpbmV0eXBlID0gImRhc2hlZCIsIAogICAgICAgICAgICAgY29sb3VyID0gInJlZCIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoZXhwYW5kID0gYygwLDApLCAKICAgICAgICAgICAgICAgICAgICAgbGltaXRzID0gYygtMC4wNSwgMSkpICsKICBsYWJzKHggPSAiTWlkLVdpbmRvdyBQb3NpdGlvbiIsIAogICAgICAgeSA9ICJGc3QiLCAKICAgICAgIHRpdGxlID0gIkNBTi0teC0tTUFULS1zaXplLTUwMDAwLS1zdGVwLTEwMDAiLCAKICAgICAgIHN1YnRpdGxlID0gIkNocm9tb3NvbWUgMiBlbGV2YXRlZCBZVV9BUHNldWRvIGdlbm9tZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIAogICAgICAgIHBhbmVsLmdyaWQubWFqb3IueCA9IGVsZW1lbnRfYmxhbmsoKSwgCiAgICAgICAgcGFuZWwuZ3JpZC5taW5vci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBheGlzLnRpdGxlLnkgPSBlbGVtZW50X21hcmtkb3duKCksIAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSA4LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2anVzdCA9IDAuNSkpCmNhbnhtYXRfY2hyMl9lbGV2X3Bsb3QKCmNhbnhtYXRfY2hyM19wbG90IDwtIGdncGxvdChkYXRhID0gZmlsdGVyKGNhbnhtYXRfZGF0YSwgY2hyID09ICJKQkdHV1UwMTAwMDAwMDMuMSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmcgPSBhZXMoeCA9IG1pZFBvcywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihjYW54bWF0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKGNhbnhtYXRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiQ0FOLS14LS1NQVQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueG1hdF9jaHIzX3Bsb3QKCmNhbnhtYXRfY2hyM19lbGV2X3Bsb3QgPC0gZ2dwbG90KGRhdGEgPSBmaWx0ZXIoY2FueG1hdF9kYXRhLCBjaHIgPT0gIkpCR0dXVTAxMDAwMDAwMy4xIiAmIG1pZFBvcyA+PSAyOTAwMDAwMCAmIG1pZFBvcyA8PSAzMjAwMDAwMCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nID0gYWVzKHggPSBtaWRQb3MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBGc3QpKSArCiAgZ2VvbV9wb2ludChhbHBoYSA9IDAuNzUsIHNpemUgPSAwLjUsIGNvbG9yID0gImRhcmtzbGF0ZWJsdWUiKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gbWVhbihjYW54bWF0X2RhdGEkRnN0KSkgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IHF1YW50aWxlKGNhbnhtYXRfZGF0YSRGc3QsIHByb2JzID0gYygwLjk5KSksIAogICAgICAgICAgICAgbGluZXR5cGUgPSAiZGFzaGVkIiwgCiAgICAgICAgICAgICBjb2xvdXIgPSAicmVkIikgKwogIHNjYWxlX3lfY29udGludW91cyhleHBhbmQgPSBjKDAsMCksIAogICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSBjKC0wLjA1LCAxKSkgKwogIGxhYnMoeCA9ICJNaWQtV2luZG93IFBvc2l0aW9uIiwgCiAgICAgICB5ID0gIkZzdCIsIAogICAgICAgdGl0bGUgPSAiQ0FOLS14LS1NQVQtLXNpemUtNTAwMDAtLXN0ZXAtMTAwMCIsIAogICAgICAgc3VidGl0bGUgPSAiQ2hyb21vc29tZSAzIGVsZXZhdGVkIFlVX0FQc2V1ZG8gZ2Vub21lIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgCiAgICAgICAgcGFuZWwuZ3JpZC5tYWpvci54ID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yLnggPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfbWFya2Rvd24oKSwgCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IDgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZqdXN0ID0gMC41KSkKY2FueG1hdF9jaHIzX2VsZXZfcGxvdApgYGAKCgoK